package org.flowers.unbeaten.util;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.flowers.unbeaten.exception.code.BaseResponseCode;
import org.flowers.unbeaten.exception.code.ResponseCode;

import java.io.Serializable;

/**
 * @description 前后端分离，响应数据封装DataResult
 * @author RyanWang
 * @date 2021-07-16 13:45:15
 * @version 1.0
 */
@Data
@SuppressWarnings("all")
public class DataResult<T> implements Serializable {

    /**
     * 响应code：200为成功，其他为失败
     */
    @ApiModelProperty(value = "响应code", name = "code")
    private Integer code;

    /**
     * 响应信息
     */
    @ApiModelProperty(value = "响应信息", name = "message")
    private String message;

    /**
     * 响应数据
     */
    @ApiModelProperty(value = "响应数据", name = "data")
    private T data;

    /**
     * 有参构造方法
     * @param code      响应code
     * @param message   响应信息
     * @param data      响应数据
     */
    public DataResult(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 有参构造方法
     * @param code      响应code
     * @param message   响应数据
     */
    public DataResult(Integer code, String message) {
        this.code = code;
        this.message = message;
        this.data = null;
    }

    /**
     * 有参构造方法
     * @param code      响应code
     * @param data      响应数据
     */
    public DataResult(Integer code, T data) {
        this.code = code;
        this.data = data;
        this.message = null;
    }

    /**
     * 有参构造方法
     * @param data 响应数据
     */
    public DataResult(T data) {
        this.code = BaseResponseCode.OK.getCode();
        this.message = BaseResponseCode.OK.getMessage();
        this.data = data;
    }

    /**
     * 有参构造方法
     * @param exceptionCode 可以获得响应code和响应信息
     * @param data          响应数据
     */
    public DataResult(ResponseCode exceptionCode, T data) {
        this.code = exceptionCode.getCode();
        this.message = exceptionCode.getMessage();
        this.data = data;
    }

    /**
     * 有参构造方法
     * @param exceptionCode 可以获得响应code和响应信息
     */
    public DataResult(ResponseCode exceptionCode) {
        this.code = exceptionCode.getCode();
        this.message = exceptionCode.getMessage();
        this.data = null;
    }

    /**
     * 无参构造方法
     */
    public DataResult() {
        this.code = BaseResponseCode.OK.getCode();
        this.message = BaseResponseCode.OK.getMessage();
        this.data = null;
    }

    /**
     * 自定义返回：data不为null
     * @param code      响应code
     * @param message   响应信息
     * @param data      响应数据
     * @param <T>
     * @return
     */
    public static <T> DataResult<T> getResult(Integer code, String message, T data) {
        return new DataResult<>(code, message, data);
    }

    /**
     * 自定义返回：data为null
     * @param code      响应code
     * @param message   响应信息
     * @param <T>
     * @return
     */
    public static <T> DataResult<T> getResult(Integer code, String message) {
        return new DataResult<>(code, message);
    }

    /**
     * 自定义返回：data不为null
     * @param code 响应code
     * @param data 响应数据
     * @param <T>
     * @return
     */
    public static <T> DataResult<T> getResult(Integer code, T data) {
        return new DataResult<>(code, data);
    }

    /**
     * 自定义返回：入参一般是异常code枚举data可控
     * @param responseCode  可以获得响应code和响应信息
     * @param data          响应数据
     * @param <T>
     * @return
     */
    public static <T> DataResult<T> getResult(ResponseCode responseCode, T data) {
        return new DataResult<>(responseCode, data);
    }

    /**
     * 自定义返回：入参一般是异常code枚举data为空
     * @param responseCode 可以获得响应code和响应信息
     * @param <T>
     * @return
     */
    public static <T> DataResult<T> getResult(ResponseCode responseCode) {
        return new DataResult<>(responseCode);
    }

    /**
     * 操作成功：data不为null
     * @param data 响应数据
     * @param <T>
     * @return
     */
    public static <T> DataResult<T> success(T data) {
        return new DataResult<>(data);
    }

    /**
     * 操作成功：data为null
     * @param <T>
     * @return
     */
    public static <T> DataResult<T> success() {
        return new DataResult<>();
    }

    /**
     * 操作失败：data为null
     * @param message 响应消息
     * @param <T>
     * @return
     */
    public static <T> DataResult<T> failure(String message) {
        return new DataResult<>(BaseResponseCode.FAILURE.getCode(), message);
    }

}
